Object-oriented programming often requires the execution of routines that identify the types of the objects that are to be instantiated during execution of a program. Often, it is necessary to determine the type of one or more software objects to guarantee that the objects will be compatible with the type assumption of the underlying hardware and/or software system that will use the objects.
Object type compatibility is particularly important for dynamic programming languages such as, for example, Java and C#, both of which are well-known dynamic programming languages. By way of background, dynamic programming languages such as Java and C# are not statically compiled into native machine code for execution on a particular hardware platform as are many static languages such as, for example, C++. Instead, dynamic programming language instructions are first compiled into bytecodes. The bytecodes are then transmitted (e.g., via the Internet) or otherwise conveyed to a target processing system, which interprets and/or just-in-time (JIT) compiles the bytecodes using a software application commonly referred to as a virtual machine.
A virtual machine acts as an execution engine that interposes or interfaces between the hardware platform and operating system of the target processing system and the bytecodes of the program to be executed by the target processing system. In this manner, any type of target processing system having virtually any type of hardware platform and operating system that can perform the functions of the virtual machine can execute the bytecodes making up the dynamic program. In other words, a virtual machine enables a program written in a dynamic language such as Java, for example, to become hardware platform and operating system independent.
Thus, programs are frequently written using a dynamic programming language to facilitate execution of the programs on a variety of hardware platforms and operating systems, some or all of which may not be known prior to compilation and execution of the programs. For example, many programs that are downloaded from web sites via the Internet are written using Java instructions that have been compiled into Java bytecodes. A target computer system (e.g., a computer system that is downloading the Java bytecodes for execution), can use a Java virtual machine to interpret and/or compile and execute the Java bytecodes, regardless of the specific hardware and operating system characteristics of the target computer system.
Regardless of whether a program is written using Java, C#, or some other program language, real-time compilation and execution of program instructions typically requires real-time type information (RTTI). RTTI is typically acquired by executing real-time software object type tests. In general, real-time software object type tests enable a virtual machine to determine the types of objects (as they are called for execution) during run-time or program execution. Some dynamic languages such as Java and C# provide explicit primitives or instructions to obtain RTTI. For example, Java provides instanceof, checkcast, and other primitives, whereas C# provides isinst, castclass, and other primitives. Unfortunately, to obtain RTTI, a substantial amount of object type information must be stored and processed during compilation or run-time, which consumes a substantial amount of processing time, system memory and/or register space.